package com.bit.cfdi.web.vm.negocio;

import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;

import com.bit.cfdi.web.constants.NavInfrastructure;
import com.bit.cfdi.web.domain.DBConstants;
import com.bit.cfdi.web.domain.DatosFiscales;
import com.bit.cfdi.web.domain.Direccion;
import com.bit.cfdi.web.domain.ModulosUsuario;
import com.bit.cfdi.web.domain.Negocio;
import com.bit.cfdi.web.domain.Sucursal;
import com.bit.cfdi.web.domain.Usuario;
import com.bit.cfdi.web.domain.UsuarioNegocio;
import com.bit.cfdi.web.services.NegocioService;
import com.bit.cfdi.web.services.UsuarioNegocioService;
import com.bit.cfdi.web.session.SessionUtils;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class NuevoNegocioViewModel {
	
	private Logger log = LogManager.getLogger(this.getClass().getName());
	
	//Spring variables
	@WireVariable private SessionUtils sessionUtils;
	@WireVariable private NegocioService negocioService;
	@WireVariable private UsuarioNegocioService usuarioNegocioService;
	
	//To show in form
	private Negocio newNegocio;
	
	@Init
	public void init() {
		initNewNegocio();
	}
	
	//Getters-Setters
	public Negocio getNewNegocio() {
		return newNegocio;
	}
	
	//Local Commands
	@Command @NotifyChange({"newNegocio"})
	public void performSaveNewNegocio() {
		log.info("save new negocio");
		Usuario usuario = (Usuario) sessionUtils.getFromSession(
				SessionUtils.USUARIO);
		negocioService.save(newNegocio);
		log.info("negocio persisted");
		UsuarioNegocio usuarioNegocio = new UsuarioNegocio();
		usuarioNegocio.setNegocio(newNegocio);
		usuarioNegocio.setUsuario(usuario);
		usuarioNegocio.setStatus(DBConstants.STATUS_ACTIVE);
		for(String currentModule : NavInfrastructure.ALL_MODULES) {
			ModulosUsuario modu = new ModulosUsuario();
			modu.setUsuarioNegocio(usuarioNegocio);
			modu.setNombreModulo(currentModule);
			usuarioNegocio.getAccesos().add(modu);
		}
		usuarioNegocioService.save(usuarioNegocio);
		log.info("usuario negocio persisted for negocio");
		BindUtils.postGlobalCommand(null, null, "negocioRefreshOtherUserBusiness", 
				null);
		initNewNegocio();
		newBusinessMessage();
		Map<String, Object> toRedirect = new HashMap<String, Object>();
		toRedirect.put("key", "BIENVENIDO");
		BindUtils.postGlobalCommand(null, null, "changeModule", 
				toRedirect);
	}
	
	//Private Methods
	private void initNewNegocio() {
		log.info("Creating new business");
		newNegocio = new Negocio();
		newNegocio.setDatosFiscales(new DatosFiscales());
		newNegocio.getDatosFiscales().setDireccion(new Direccion());
		Sucursal matriz = new Sucursal();
		matriz.setNegocio(newNegocio);
		matriz.setDireccion(new Direccion());
		matriz.setTipo(Sucursal.TIPO_MATRIZ);
		newNegocio.getSucursales().add(matriz);
		Sucursal sucursal = new Sucursal();
		sucursal.setNegocio(newNegocio);
		sucursal.setDireccion(new Direccion());
		sucursal.setTipo(Sucursal.TIPO_SUCURSAL);
		newNegocio.getSucursales().add(matriz);
	}
	
	private void newBusinessMessage() {
		Messagebox.show("Nuevo negocio agregado");
	}

}
